package be.vdab.servlets;

import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import be.vdab.entities.Bestelbon;
import be.vdab.entities.WijnInfo;
import be.vdab.services.BestelbonService;
import be.vdab.services.WijnService;
import be.vdab.valueobjects.Bestelbonlijn;


/**
 * Servlet implementation class MandjeServlet
 */
@WebServlet("/wijnen/mandje.htm")
public class MandjeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String VIEW = "/WEB-INF/JSP/wijnen/mandje.jsp";
	private static final String REDIRECT_URL = "/wijnen/bevestigd.htm";
	private final BestelbonService bestelbonService = new BestelbonService();
	private final WijnService wijnService = new WijnService();
     
	private BigDecimal calculateBedrag (List<WijnInfo> bestellingen){
		BigDecimal som = BigDecimal.ZERO;
		for (WijnInfo bestelling:bestellingen){
			BigDecimal aantal = new BigDecimal(bestelling.getAantal());
			BigDecimal prijs = bestelling.getWijn().getPrijs();
			BigDecimal subTotaal = aantal.multiply(prijs);
			som = som.add(subTotaal);
		}
		return som;
	}
	
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	HttpSession session = request.getSession();
    	@SuppressWarnings("unchecked")
		BigDecimal som = calculateBedrag((List<WijnInfo>) session.getAttribute("bestellingen"));
    	session.setAttribute("som", som);
    	request.getRequestDispatcher(VIEW).forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		List<String> fouten = new ArrayList<>();
		Date bestelDatum = new Date();
		
		String voornaam = request.getParameter("naam");
		if (voornaam == null || voornaam.isEmpty()) {
			fouten.add("Voornaam verplicht");
		}
		String straat = request.getParameter("straat");
		if (straat == null || straat.isEmpty()) {
			fouten.add("Straat verplicht");
		}
		String huisNr = request.getParameter("huisNr");
		if (huisNr == null || huisNr.isEmpty()) {
			fouten.add("Huisnummer verplicht");
		}
		String postcode = request.getParameter("postcode");
		if (postcode == null || postcode.isEmpty()) {
			fouten.add("Postcode verplicht");
		}
		String gemeente = request.getParameter("gemeente");
		if (gemeente == null || gemeente.isEmpty()) {
			fouten.add("Gemeente verplicht");
		}
		
		String bestelMethode = request.getParameter("bestelMethode");
		if (bestelMethode == null) {
			fouten.add("Wat is de bestel methode");
		}
		
		@SuppressWarnings("unchecked")
		List<WijnInfo> bestellingen = (List<WijnInfo>) session.getAttribute("bestellingen");
		if (fouten.isEmpty() && !bestellingen.isEmpty()){
			
			BigDecimal som = calculateBedrag(bestellingen);
	    	session.setAttribute("som", som);
			
			int bestelwijze = 0;
			String methode = request.getParameter("bestelMethode");
			if (methode.equals("OPSTUREN")){
				bestelwijze = 1;
			}
			Bestelbon bestelbon = new Bestelbon(bestelDatum, voornaam, straat, huisNr, postcode, gemeente, bestelwijze);
			bestelbonService.create(bestelbon);
			long bonNr = bestelbon.getBonNr();
			for (WijnInfo bestelling:bestellingen){
				Bestelbonlijn bestelbonlijn = new Bestelbonlijn(bestelling.getWijn().getWijnNr(), bestelling.getAantal());
				bestelbonService.bestelbonlijnToevoegen(bonNr, bestelling.getWijn().getWijnNr(), bestelbonlijn);
				wijnService.updateBestelling(bestelling.getWijn().getWijnNr(), bestelling.getAantal());
			}
			
			bestellingen.clear();
			session.setAttribute("bestellingen", bestellingen);
			session.setAttribute("bonNr", bonNr);
			response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + REDIRECT_URL));
		} else {
			request.setAttribute("fouten", fouten);
			request.getRequestDispatcher(VIEW).forward(request, response);
		}
				
		
	}

}
